package cbm.commons;

import java.io.IOException;
import java.util.List;
import java.util.ResourceBundle;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.web.context.support.HttpRequestHandlerServlet;
import org.springframework.web.context.support.WebApplicationContextUtils;

import ejb.cbm.admin.bean.ArchivoBean;
import ejb.cbm.admin.entity.ArchivoEntity;
import ejb.cbm.admin.local.ArchivoSessionLocal;
import ejb.cbm.admin.local.ParametroFacadeLocal;
import ejb.cbm.seguridad.local.PerfilFacadeLocal;
import ejb.cbm.seguridad.local.UtilSeguridadFacadeLocal;
import ejb.com.bbva.cbm.service.AdministracionServiceLocal;

public class InicializacionServlet extends HttpRequestHandlerServlet  {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1423776669233728851L;

	static Logger logger = Logger.getLogger(InicializacionServlet.class.getName());

	PerfilFacadeLocal perfilFacadeLocal;
	ParametroFacadeLocal parametroFacadeLocal;
	UtilSeguridadFacadeLocal utilSeguridadFacadeLocal;

	AdministracionServiceLocal administracionServiceLocal;
	ArchivoSessionLocal archivoSessionLocal;

	ResourceBundle resources = ResourceBundle.getBundle("continuidadweb");
	
	@Autowired
	public void setPerfilFacadeLocal(PerfilFacadeLocal perfilFacadeLocal) {
		this.perfilFacadeLocal = perfilFacadeLocal;
	}
	
	@Autowired
	public void setParametroFacadeLocal(
			ParametroFacadeLocal parametroFacadeLocal) {
		this.parametroFacadeLocal = parametroFacadeLocal;
	}
	
	@Autowired
	public void setUtilSeguridadFacadeLocal(
			UtilSeguridadFacadeLocal utilSeguridadFacadeLocal) {
		this.utilSeguridadFacadeLocal = utilSeguridadFacadeLocal;
	}
	
	@Autowired
	public void setArchivoSessionLocal(ArchivoSessionLocal archivoSessionLocal) {
		this.archivoSessionLocal = archivoSessionLocal;
	}
	
	@Autowired
	public void setAdministracionServiceLocal(AdministracionServiceLocal administracionServiceLocal) {
		this.administracionServiceLocal = administracionServiceLocal;
	}
	
	public InicializacionServlet() {
		super();
	}

	public void destroy() {
		super.destroy(); 
		
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		processRequest(request,response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		processRequest(request,response);
	}

	public void init() throws ServletException {
		//System.out.println("[---------INICIADO LA APLICACION DE CONTINUIDAD DE NEGOCIOS---------]");
		try {
			//System.out.println("[INICIADO PARAMETROS DE CONTEXTO]");
			ApplicationContext springcontext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
			administracionServiceLocal = (AdministracionServiceLocal) springcontext.getBean("administracionServiceLocal");
			archivoSessionLocal = (ArchivoSessionLocal) springcontext.getBean("archivoSessionLocal");
			/*
			perfilFacadeLocal = (PerfilFacadeLocal) springcontext.getBean("perfilFacadeLocal");
			parametroFacadeLocal = (ParametroFacadeLocal) springcontext.getBean("parametroFacadeLocal");
			utilSeguridadFacadeLocal = (UtilSeguridadFacadeLocal) springcontext.getBean("utilSeguridadFacadeLocal");
			
			codigoUnicoTipoParametro = resources.getString("ESTADOS_REGISTRO");
			estadoRegistro = parametroFacadeLocal.findByCodigoUnico(codigoUnicoTipoParametro);
			
			codigoUnicoTipoParametro = resources.getString("ESTADOS_CONFIRMACION");
			estadoConfirmacion = parametroFacadeLocal.findByCodigoUnico(codigoUnicoTipoParametro);
			
			codigoUnicoTipoParametro = resources.getString("TIPOS_PERFIL");
			tipoPerfil = parametroFacadeLocal.findByCodigoUnico(codigoUnicoTipoParametro);
			
			codigoUnicoTipoParametro = resources.getString("HABILITADO");
			habilitado = parametroFacadeLocal.findByCodigoUnico(codigoUnicoTipoParametro);
			
			codigoUnicoTipoParametro = resources.getString("PUESTOS");
			puestos = parametroFacadeLocal.findByCodigoUnico(codigoUnicoTipoParametro);

			codigoUnicoTipoParametro = resources.getString("TIPO_REGISTRO");
			tiporegistro     = parametroFacadeLocal.findByCodigoUnico(codigoUnicoTipoParametro);

			servletContext.setAttribute(ConstantsWeb.PERFILES, perfilFacadeLocal.buscar(new PerfilBean()));
			servletContext.setAttribute(ConstantsWeb.ESTADOS_CONFIRMACION_INGRESO, estadoConfirmacion.getParametros());
			servletContext.setAttribute(ConstantsWeb.OFICINAS, utilSeguridadFacadeLocal.obtenerOficinas());
			servletContext.setAttribute(ConstantsWeb.HABILITADO, habilitado.getParametros());
			servletContext.setAttribute(ConstantsWeb.PUESTOS, puestos.getParametros());
			servletContext.setAttribute(ConstantsWeb.TIPO_REGISTRO, tiporegistro.getParametros());
			
			ya esta
						
			servletContext.setAttribute(ConstantsWeb.ESTADOS_REGISTRO, estadoRegistro.getParametros());
			servletContext.setAttribute(ConstantsWeb.TIPO_PERFIL, tipoPerfil.getParametros());
			*/
			
			ServletContext servletContext = super.getServletContext();
			servletContext.setAttribute("cache", administracionServiceLocal.inicializarCacheDatos());
			
			ArchivoBean filtro = new  ArchivoBean();
			filtro.setDescripcion(ConstantsWeb.ARCHIVO_CRON);
			filtro.setNombrearchivo("CRONTRIGGER");
			List<ArchivoEntity> lista =  archivoSessionLocal.findByFiltro(filtro);
			ArchivoEntity beanProgramacion = null;
			if(lista.size()==1){
				beanProgramacion = lista.get(0);
			}
			
			if(beanProgramacion!=null){
				Scheduler scheduler = (Scheduler) springcontext.getBean("schedulerFactoryBean");
				CronTriggerBean trigger =  (CronTriggerBean)springcontext.getBean("CRONTRIGGER");
				StringBuffer cronExp = new StringBuffer();
				//0 0 19 1/1 * ? *
				cronExp.append(beanProgramacion.getSequence());
				JobDetail jobDetail =  trigger.getJobDetail();
				JobDetail newJob =  (JobDetail)jobDetail.clone();
				scheduler.deleteJob(jobDetail.getName(),jobDetail.getGroup());
		
				trigger.setJobDetail(newJob);
				trigger.setCronExpression(cronExp.toString());
				trigger.afterPropertiesSet();
				scheduler.scheduleJob(newJob, trigger);
			}
			//System.out.println("[INICIO PARAMETROS DE CONTEXTO FINALIZADO]");
		} catch(Exception e) {
			e.printStackTrace();logger.error(e);
		}
			
	}
	
	public void processRequest(HttpServletRequest request, HttpServletResponse response){
		response.setContentType("text/html");
		
	}

}
